package core.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import util.DbUtils;
import core.dao.CategoriaDao;
import core.model.Categoria;

/**
 * @author andoniibarguchilorenzo
 * clase que contiene los metodos implementados de la interface Categoria
 */
public class CategoriaDaoImpl extends GenericDaoImpl<Categoria, Integer>
		implements CategoriaDao {

	@Override
	public List<Categoria> getAllCategorias() {

		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		List<Categoria> categorias = new ArrayList<Categoria>();
		try {
			ps = connection
					.prepareStatement("SELECT COD_CATEGORIA, NOMBRE FROM CATEGORIA");

			ResultSet rs = ps.executeQuery();
			Categoria categoria = null;

			while (rs.next()) {
				categoria = Categoria.createCategoria(rs.getInt(1),
						rs.getString(2));
				categorias.add(categoria);

			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return categorias;
	}

	@Override
	public List<Categoria> getAllNombreCategorias() {

		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		List<Categoria> categorias = new ArrayList<Categoria>();
		try {
			ps = connection.prepareStatement("SELECT NOMBRE FROM CATEGORIA");

			ResultSet rs = ps.executeQuery();
			Categoria categoria = null;

			while (rs.next()) {
				categoria = Categoria.createCategoria(rs.getString(1));
				categorias.add(categoria);

			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return categorias;
	}

	@Override
	public void insertCategoria(String nombre_categoria) {
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		try {
			// http://db.apache.org/derby/docs/10.7/ref/crefjavstateautogen.html
			ps = connection.prepareStatement(
					"INSERT INTO SUBCATEGORIA (NOMBRE) VALUES (?)",
					PreparedStatement.RETURN_GENERATED_KEYS);
			ps.setString(1, nombre_categoria);
			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}

	}

	@Override
	public Categoria getCategoriaByName(String nombre) {
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		List<Categoria> categorias = new ArrayList<Categoria>();
		try {
			ps = connection
					.prepareStatement("SELECT COD_CATEGORIA, NOMBRE FROM CATEGORIA WHERE NOMBRE = ?");
			ps.setString(1, nombre);

			ResultSet rs = ps.executeQuery();
			Categoria categoria = null;

			while (rs.next()) {
				categoria = Categoria.createCategoria(rs.getInt(1),
						rs.getString(2));
				categorias.add(categoria);

			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return categorias.get(0);
	}

	@Override
	public Categoria getCategoriaByCode(int codigo_categoria) {
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		Categoria categoria = null;
		try {
			ps = connection
					.prepareStatement("SELECT COD_CATEGORIA, NOMBRE FROM CATEGORIA WHERE COD_CATEGORIA = ?");
			ps.setInt(1, codigo_categoria);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				categoria = Categoria.createCategoria(rs.getInt(1),
						rs.getString(2));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return categoria;

	}

}
